【Redshift】timestamp型のカラムを条件にして検索する時の書き方を変えたら爆速になった話
Redshiftでtimestamp型のカラムを条件に検索することがあると思います。先日、方法によって処理時間に差が出るのか試してみたのですが自分的には驚きの結果でした。4つのパターンを3回ずつ試して時間を計ってみました。前提条件は以下になります。
- テストしたテーブルの件数は約3億件で列数は50です。
- Redshiftは ds2.xlarge 1台で試しました。
- 検索に使うカラムは分散キーやソートキーではありません。
- countの結果は362269件でした。
to_timestamp関数を使った場合
まずは条件の方を to_timestamp関数で変換してやってみました。
select count(*) from テーブル名 where カラム名 = to_timestamp('2017/04/12 05:00:00', 'YYYY/MM/DD HH24:MI:SS');
1回目 | 37.64s |
---|---|
2回目 | 37.8s |
3回目 | 37.65s |
to_char関数を使った場合
次にカラムの方を to_char関数で変換してやってみました。
select count(*) from テーブル名 where to_char(カラム名, 'YYYY/MM/DD HH24:MI:SS') = '2017/04/12 05:00:00';
全レコード変換するのでto_timestamp関数を使うパターンより、こちらパターンは遅いのではないかと思っていたのですが意外とそうでもなかったです。
1回目 | 33.22s |
---|---|
2回目 | 33.61s |
3回目 | 33.01s |
キャストした場合
最後に文字列を 'YYYYMMDD HH24MISS' の形式にして、Timestamp型にキャストする方法です。
select count(*) from テーブル名 where カラム名= '20170412 050000'::TIMESTAMP;
いきなり早くなりました。何かの間違いではないかと疑うレベルで早かったです。ですが結果は他のSQLと一致していました。
1回目 | 0.14s |
---|---|
2回目 | 0.12s |
3回目 | 0.13s |
文字列で指定した場合
最後に'YYYY-MM-DD HH24:MI:SS'形式の文字列にしてみました。
select count(*) from テーブル名 where カラム名= '2017-04-12 05:00:00';
結果としてはキャストした場合とほぼ同じ時間でした。'YYYY-MM-DD HH24:MI:SS'形式の他に 'YYYY/MM/DD HH24:MI:SS'形式 や 'YYYYMMDD HH24MISS'形式 にした場合でも結果は同じでした。いちいち関数で型変換とかしなくていいということですね。
1回目 | 0.14s |
---|---|
2回目 | 0.13s |
3回目 | 0.14s |